package br.com.sisat.bean;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;

import br.com.sisat.modelo.EspecialidadeDTO;
import br.com.sisat.modelo.TerapeutaDTO;
import br.com.sisat.persistencia.DAO.TerapeutaDAO;
import br.com.sisat.service.PacienteService;
import br.com.sisat.service.TerapeutaService;
import br.com.sisat.util.ObjectUtil;
import br.com.sisat.util.Util;
import br.com.sisat.util.dominio.UfEnum;

public class TerapeutaBean implements Serializable {

	private static final long serialVersionUID = 1L; 

	private List<SelectItem>especialidades;
	private List<SelectItem>terapeutas;
	private List<SelectItem>ufs;
	private Long[] especialidadesIDs;
	private TerapeutaDTO terapeutaDTO;
	
	private List<TerapeutaDTO> listaTerapeutas;
	
	
	public void limparCampos(){
		getTerapeutaDTO().setIdTerapeuta(null);
		getTerapeutaDTO().setIdEspecialidade(null);
		getTerapeutaDTO().setNoTerapeuta(null);
		getTerapeutaDTO().setDeCpf(null);
		getTerapeutaDTO().setDeBairro(null);
		getTerapeutaDTO().setDeMunicipio(null);
		getTerapeutaDTO().setDeCpf(null);
		getTerapeutaDTO().setDeFoneCelular(null);
		getTerapeutaDTO().setDeFoneResidencial(null);
		getTerapeutaDTO().setDeRg(null);
		getTerapeutaDTO().setDeEmail(null);
		getTerapeutaDTO().setDeEndereco(null);
		getTerapeutaDTO().setSgUf(null);
		getTerapeutaDTO().setDeCep(null);
		setListaTerapeutas(null);
		setEspecialidadesIDs(null);
	}
	
	public String carregarInicio(){
		setTerapeutaDTO(null);
		setListaTerapeutas(null);
		setEspecialidades(null);
		setEspecialidadesIDs(null);
		return "consultarTerapeuta";
	}
	
	public String carregarConsultar(){
		setTerapeutaDTO(null);
		setListaTerapeutas(null);
		return "consultarTerapeuta";
	}
	
	public String carregarIncluir(){
		setEspecialidades(null);
		return "incluirTerapeuta";
	}
	
	public String carregarAlterar(){
		getTerapeutaDTO();
		especialidadesIDs = new Long[getTerapeutaDTO().getEspecialidades().size()];
		for (int i = 0; i < especialidadesIDs.length; i++) {
			 especialidadesIDs[i] = getTerapeutaDTO().getEspecialidades().get(i).getIdEspecialidade();
			
		}
		
		return "alterarTerapeuta";
	}
	
	public void executarConsultar(){
		if(validaFormularioEmBranco()){
			FacesMessage mensagem = new FacesMessage("Nenhum filtro foi informado");
			FacesContext.getCurrentInstance().addMessage(null, mensagem);
			return;
		}
		
		setListaTerapeutas(TerapeutaService.getInstance().executarConsulta(getTerapeutaDTO()));
		if(getListaTerapeutas().size() == 0){
			FacesMessage mensagem = new FacesMessage("Nenhum registro encontrado.");
			FacesContext.getCurrentInstance().addMessage(null, mensagem);
		}
	}
	
	private boolean validaFormularioEmBranco() {
		if(!ObjectUtil.isEmpty(getTerapeutaDTO().getNoTerapeuta())){
			return false;
		}

		if(getTerapeutaDTO().getIdEspecialidade().intValue()!=0){
			return false;
		}
		return true;
	}

	public String executarIncluir(){
		if(validaDados()){
			
			for(Long especialidadeID: especialidadesIDs){
				EspecialidadeDTO especialidade = new EspecialidadeDTO();
				especialidade.setIdEspecialidade(especialidadeID);
				getTerapeutaDTO().getEspecialidades().add(especialidade);
			}
			
			TerapeutaService.getInstance().executarIncluir(getTerapeutaDTO());
			FacesMessage mensagem = new FacesMessage("Terapeuta incluído(a) com sucesso");
			FacesContext.getCurrentInstance().addMessage(null, mensagem);
			setTerapeutaDTO(null);
			setListaTerapeutas(null);
			setEspecialidades(null);
			setEspecialidadesIDs(null);
			return "consultarTerapeuta";
		}
		return "incluirTerapeuta";
	}
	
	public String executarAlterar(){
		if (!ObjectUtil.isEmpty(terapeutaDTO)){
			if (validaDados()){
				if(!validaEspecialidades()){
					FacesMessage mensagem = new FacesMessage("Este terapeuta possui especialidades, que não podem ser removidas devido a realização de consultas");
					FacesContext.getCurrentInstance().addMessage(null, mensagem);
					return null;
				}
				
				TerapeutaService.getInstance().executarAlterar(getTerapeutaDTO());
				FacesMessage mensagem = new FacesMessage("Terapeuta alterado(a) com sucesso");
				FacesContext.getCurrentInstance().addMessage(null, mensagem);
				setTerapeutaDTO(null);
				return carregarConsultar();
			}
		}
		return "alterarTerapeuta";	
		
	}

	private boolean validaEspecialidades() {
		List<EspecialidadeDTO>novasEspecialidades = new ArrayList<EspecialidadeDTO>();
		forId:for(Long especialidadeID: especialidadesIDs){
			for(EspecialidadeDTO especialidade: getTerapeutaDTO().getEspecialidades()){
				if(especialidadeID.equals(especialidade.getIdEspecialidade())){
					novasEspecialidades.add(especialidade);
					continue forId;
				}
			}
			
			EspecialidadeDTO especialidade = new EspecialidadeDTO();
			especialidade.setIdEspecialidade(especialidadeID);
			novasEspecialidades.add(especialidade);
		}
		
		//compara o que entra e o que sai
		forEspec:for(EspecialidadeDTO especialidade: getTerapeutaDTO().getEspecialidades()){
			for(EspecialidadeDTO nova: novasEspecialidades){
				if(especialidade.getIdEspecialidade().equals(nova.getIdEspecialidade())){
					continue forEspec;
				}
			}
			
			if(especialidade.getConsultas()!=null && especialidade.getConsultas().intValue()>0){
				return false;
			}
			getTerapeutaDTO().getEspecialidadesARemover().add(especialidade);
		}
		getTerapeutaDTO().setEspecialidades(novasEspecialidades);
		return true;
	}

	public String executarExcluir() throws Exception{
		if(verificaDependencia()==true){
			if (!ObjectUtil.isEmpty(terapeutaDTO)){
				TerapeutaService.getInstance().executarExcluir(getTerapeutaDTO());
				FacesMessage mensagem = new FacesMessage("Terapeuta excluído(a) com sucesso");
				FacesContext.getCurrentInstance().addMessage(null, mensagem);
				setTerapeutaDTO(null);
				//executarConsultar();
				return "consultarTerapeuta";
			}
		}
		FacesMessage mensagem = new FacesMessage ("Não foi possível excluir os dados do(a) Terapeuta!");
		FacesContext.getCurrentInstance().addMessage(null, mensagem);
		
		return "consultarTerapeuta";
	}
	

	public boolean verificaDependencia() throws Exception{
		if(((TerapeutaDAO.getInstance().verificaDependencia(terapeutaDTO)).size())>0){
			FacesMessage mensagem = new FacesMessage("Terapeuta não pode ser removido por estar em uma consulta!");
			FacesContext.getCurrentInstance().addMessage(null, mensagem);
			return false;
		}
		return true;
	}

	
	public boolean validaDados(){
		if(ObjectUtil.isEmpty(getTerapeutaDTO().getNoTerapeuta())){
			FacesMessage mensagem = new FacesMessage("Campo obrigatório não informado: Nome");
			FacesContext.getCurrentInstance().addMessage(null, mensagem);
			return false;
		}
		if(ObjectUtil.isEmpty(getTerapeutaDTO().getDeCpf())){
			FacesMessage mensagem = new FacesMessage("Campo obrigatório não informado: CPF");
			FacesContext.getCurrentInstance().addMessage(null, mensagem);
			return false;
		}else if(!Util.getInstance().validaCPF(getTerapeutaDTO().getDeCpf())) {
			FacesMessage mensagem = new FacesMessage("Dado inválido: CPF");
			FacesContext.getCurrentInstance().addMessage(null, mensagem);
			return false;
		}
		if(PacienteService.getInstance().verificaExistenciaCPF(getTerapeutaDTO().getDeCpf())){
			FacesMessage mensagem = new FacesMessage("Já existe uma pessoa cadastrada com este CPF");
			FacesContext.getCurrentInstance().addMessage(null, mensagem);
			return false;
		}

		if(ObjectUtil.isEmpty(getTerapeutaDTO().getDeEmail())){
			FacesMessage mensagem = new FacesMessage("Campo obrigatório não informado: Email");
			FacesContext.getCurrentInstance().addMessage(null, mensagem);
			return false;
		}
		if(ObjectUtil.isEmpty(getTerapeutaDTO().getDeEndereco())){
			FacesMessage mensagem = new FacesMessage("Campo obrigatório não informado: Endere�o");
			FacesContext.getCurrentInstance().addMessage(null, mensagem);
			return false;
		}
		if(ObjectUtil.isEmpty(getTerapeutaDTO().getDeBairro())){
			FacesMessage mensagem = new FacesMessage("Campo obrigatório não informado: Bairro");
			FacesContext.getCurrentInstance().addMessage(null, mensagem);
			return false;
		}
		if(ObjectUtil.isEmpty(getTerapeutaDTO().getDeMunicipio())){
			FacesMessage mensagem = new FacesMessage("Campo obrigatório não informado: Munic’pio");
			FacesContext.getCurrentInstance().addMessage(null, mensagem);
			return false;
		}
		if(ObjectUtil.isEmpty(getTerapeutaDTO().getSgUf())){
			FacesMessage mensagem = new FacesMessage("Campo obrigatório não informado: UF");
			FacesContext.getCurrentInstance().addMessage(null, mensagem);
			return false;
		}
		if(ObjectUtil.isEmpty(getTerapeutaDTO().getDeCep())){
			FacesMessage mensagem = new FacesMessage("Campo obrigatório não informado: CEP");
			FacesContext.getCurrentInstance().addMessage(null, mensagem);
			return false;
		}
		if(ObjectUtil.isEmpty(getTerapeutaDTO().getDeFoneCelular())){
			FacesMessage mensagem = new FacesMessage("Campo obrigatório não informado: Fone Celular");
			FacesContext.getCurrentInstance().addMessage(null, mensagem);
			return false;
		}
		if(ObjectUtil.isEmpty(getTerapeutaDTO().getDeRg())){
			FacesMessage mensagem = new FacesMessage("Campo obrigatório não informado: RG");
			FacesContext.getCurrentInstance().addMessage(null, mensagem);
			return false;
		}
		if(ObjectUtil.isEmpty(especialidadesIDs)){
			FacesMessage mensagem = new FacesMessage("Campo obrigatório não informado: Especialidade");
			FacesContext.getCurrentInstance().addMessage(null, mensagem);
			return false;
		}
		return true;
	}
	
	
	public TerapeutaDTO getTerapeutaDTO() {
		if (terapeutaDTO == null) {
			terapeutaDTO = new TerapeutaDTO();
		}
		return terapeutaDTO;
	}

	public void setTerapeutaDTO(TerapeutaDTO terapeutaDTO) {
		this.terapeutaDTO = terapeutaDTO;
	}
	
	public List<SelectItem> getEspecialidades() {
		if (especialidades == null) {
			especialidades = new ArrayList<SelectItem>();
			List<EspecialidadeDTO> _especialidades = new ArrayList<EspecialidadeDTO>();
			_especialidades = TerapeutaService.getInstance().recuperarEspecialidades();
			for(EspecialidadeDTO esp : _especialidades){
				especialidades.add(new SelectItem(esp.getIdEspecialidade().toString(), esp.getNoEspecialidade()));
			}
		}
		return especialidades;
	}


	public void setEspecialidades(List<SelectItem> especialidades) {
		this.especialidades = especialidades;
	}


	public List<SelectItem> getTerapeutas() {
		if (terapeutas == null) {
			terapeutas = new ArrayList<SelectItem>();
			List<TerapeutaDTO> _terapeutas = new ArrayList<TerapeutaDTO>();
			_terapeutas = TerapeutaService.getInstance().recuperarTerapeutas();
			for(TerapeutaDTO _tera : _terapeutas){
				terapeutas.add(new SelectItem(_tera.getIdTerapeuta().toString(), _tera.getNoTerapeuta()));
			}
		}
		return terapeutas;
	}


	public void setTerapeutas(List<SelectItem> terapeutas) {
		this.terapeutas = terapeutas;
	}

	public List<TerapeutaDTO> getListaTerapeutas() {
		if (listaTerapeutas == null) {
			listaTerapeutas = new ArrayList<TerapeutaDTO>();
		}
		return listaTerapeutas;
	}

	public void setListaTerapeutas(List<TerapeutaDTO> listaTerapeutas) {
		this.listaTerapeutas = listaTerapeutas;
	}

	public List<SelectItem> getUfs() {
		if (ufs == null) {
			ufs = new ArrayList<SelectItem>();
			for(UfEnum uf : UfEnum.values()){
				//						1º - banco, 2º - apresenta na tela
				ufs.add(new SelectItem(uf.getDescricao(), uf.getDescricao()));
				
			}
		}
		return ufs;
	}

	public void setUfs(List<SelectItem> ufs) {
		this.ufs = ufs;
	}

	public Long[] getEspecialidadesIDs() {
		return especialidadesIDs;
	}

	public void setEspecialidadesIDs(Long[] especialidadesIDs) {
		this.especialidadesIDs = especialidadesIDs;
	}
	
	
}
